이전 커밋으로 되돌리기

깃 커밋 되돌리기

2023-08-11

마크다운 이미지

깃 저장소에서 이미 커밋한 내용을 되돌릴때가 있을 수 있습니다.!

깃 저장소에 커밋한 내용을 되돌리는 방법은 크게 resetrevert가 존재합니다.

git reset

reset은 Head의 위치가 바뀝니다.

아래의 그림처럼 git reset --soft B를 적용하면 Head의 위치가 B로 이동하는 것을 볼 수 있습니다

마크다운 이미지

예를들어 97f1e31 -> d678197 -> 12741e5순으로 커밋을 했고, 마지막 커밋 12741e5를 취소하고 싶습니다.

git log

12741e5(Head->main) Add ThisisaFile
d678197 Add .gitignore
97f1e31 Readme.md

다음의 명령어로 HEAD가 이전 커밋(d678197)을 가리키게 합니다.

git reset --hard d678197

이제 git status로 상태를 확인해보면 HEAD가 2번쨰 커밋 d678197을 가리키고 있고, 저장소에 반영되었습니다.

git reset<옵션><돌아가고싶은 커밋id>

이때 옵션으로 총 3가지를 넣을 수 있습니다.

git reset --soft:

soft 옵션은 작업 트리와 인덱스(index)를 변경하지 않고, 현재 브랜치의 HEAD를 이전 커밋으로 옮기는 동작을 수행합니다.

이렇게 하면 커밋은 취소되지만, 변경 내용은 스테이징 영역에 그대로 남게 됩니다. 이후에는 변경 내용을 다시 스테이징하고 새로운 커밋을 생성할 수 있습니다.

git reset --mixed (기본 옵션):

mixed 옵션은 기본적으로 적용되는 옵션으로, 작업 트리의 변경 내용은 그대로 두고 스테이징 영역만 이전 커밋으로 돌아가게 됩니다.

즉, 이전 커밋으로 되돌아가면서 변경 내용은 스테이징 영역에서 제거됩니다. 이후에 변경 내용을 다시 스테이징하고 새로운 커밋을 생성할 수 있습니다.

git reset --hard

hard 옵션은 가장 강력한 옵션으로, 작업 트리, 스테이징 영역, 그리고 인덱스까지 모두 이전 커밋으로 되돌립니다.

변경 내용은 모두 삭제되며, 이전 커밋 상태로 작업 트리가 완전히 복원됩니다. 이 옵션을 사용할 때는 주의해야 하며, 변경 내용이 영구적으로 삭제될 수 있으므로 신중하게 사용해야 합니다.

정리해보면 아래와 같습니다.!

git revert

git revert는 과거로 돌아가겠다는 이력을 남겨두고 원하는 시점으로 돌아갑니다. 논리적으로 실제 내용이 이전으로 돌아가도, 커밋 내역은 하나 더 만들어지게 됩니다.

아래의 그림처럼 커밋을 B로 되돌릴떄 B로 되돌리는 새로운 커밋을 만드는 것을 볼 수 있습니다.

revert 마크다운 이미지

(커밋 상태)

commit message : 1 (commit hash = 1)
commit message : 2 (commit hash = 2)
commit message : 3 (commit hash = 3)


(revert 실행)
git revert 2

(결과)

commit message : 1 (commit hash = 1)
commit message : 2 (commit hash = 2)
commit message : 3 (commit hash = 3)
commit message : Revert "2" (commit hash = 4)

//2번 이후 커밋이 제거되지 않고 2번 커밋에 해당하는 내용만 제거된다.